// HaveContainer.h
// Created by Limou on 24-9-13.
// 描述了一个已有好友可选列表的滚动区域

#ifndef FRONTEND_HAVECONTAINER_HPP
#define FRONTEND_HAVECONTAINER_HPP

#include <vector>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QSize>
#include "../../common/Common.hpp"
#include "Container.hpp"

// >>> class ChooseFriendDialog begin: 描述已有好友区域的部件 >>>
namespace chat_system::subassembly::ChooseFriendDialog {
    class HaveContainer : public QWidget {
    Q_OBJECT

    private:
        QLabel* haveFriendLab_; // "已有好友" 标签部件
        Container* container_; // 滚动区域部件
        QPushButton* allCancelBtn_; // 全部求奥按钮部件

    public:
        // 构造方法
        explicit HaveContainer(QWidget *parent = nullptr)
                : QWidget(parent)
                , haveFriendLab_(new QLabel(this))
                , container_(new Container(this))
                , allCancelBtn_(new QPushButton(this)) {
            this->setElement(); // 设置组件
            this->setElementStyle(); // 设置组件样式
            this->setElementLayout(); // 设置组件布局
            this->setElementSignalSlot(); // 设置信号槽
        }

        // 析构方法
        ~HaveContainer() override = default;

        // 获取滚动区域方法(方便其他组件获取子项信号)
        Container* getContainer() {
            return container_;
        }

    private:
        // 设置组件方法
        void setElement() {
            // 导入已有用户
#ifdef TEST
            QIcon icon(":/test/limou.png"); // TODO: 这里只是模拟导入
            if (icon.isNull()) { common::Tools::getInstance()->getLogger()->error("icon is null"); }
            auto user = model::UserModel::makeUser(
                    "limou",
                    "13533330000",
                    "优雅永不过时",
                    icon,
                    "1"
            );

            auto user1 = model::UserModel::makeUser(
                    "Alice",                 // 用户名
                    "12345678901",           // 电话号码
                    "探索无止境",             // 个性签名
                    icon,                    // 保持 icon 不变
                    "1001"                   // ID
            );

            auto user2 = model::UserModel::makeUser(
                    "Bob",                   // 用户名
                    "12345678902",           // 电话号码
                    "代码即艺术",             // 个性签名
                    icon,                    // 保持 icon 不变
                    "1002"                   // ID
            );

            auto user3 = model::UserModel::makeUser(
                    "Charlie",               // 用户名
                    "12345678903",           // 电话号码
                    "挑战自我",               // 个性签名
                    icon,                    // 保持 icon 不变
                    "1003"                   // ID
            );

            auto user4 = model::UserModel::makeUser(
                    "Diana",                 // 用户名
                    "12345678904",           // 电话号码
                    "享受编程的乐趣",         // 个性签名
                    icon,                    // 保持 icon 不变
                    "1004"                   // ID
            );

            auto user5 = model::UserModel::makeUser(
                    "Eve",                   // 用户名
                    "12345678905",           // 电话号码
                    "永远学习",               // 个性签名
                    icon,                    // 保持 icon 不变
                    "1005"                   // ID
            );

            // TODO: 者里就会有一个用户列表
            std::vector<model::UserModel> users;
            users.push_back(user); users.push_back(user1); users.push_back(user2); users.push_back(user3);
            users.push_back(user4); users.push_back(user5); users.push_back(user); users.push_back(user);
            users.push_back(user); users.push_back(user); users.push_back(user); users.push_back(user);
            users.push_back(user); users.push_back(user); users.push_back(user); users.push_back(user);
            users.push_back(user); users.push_back(user); users.push_back(user); users.push_back(user);

            for (auto user : users) {
                container_->addTailItem(user, false);
            }

            common::Tools::getInstance()->getLogger()->trace("The number that has been added {}", std::to_string(users.size()));

#endif

            // TODO: 默认选中一个用户
        }

        // 设置组件样式方法
        void setElementStyle() {
            // 提前定义标签按钮样式
            QString labelStyleSheet =
                    "QLabel {"
                    "color: black;"
                    "border: none;"
                    "background-color: transparent;"
                    "font-size: 15px;"
                    "}";

            // 提前定义完成按钮样式
            QString allCancelBtnStyleSheet =
                    "QPushButton {" // 默认时
                    "color: red;"
                    "border: none;"
                    "font-size: 15px;"
                    "background-color: rgb(243, 243, 243);"
                    "border-radius: 5px;"
                    "}"
                    "QPushButton:hover {" // 鼠标悬停时
                    "background-color: rgb(219, 219, 219);"
                    "}"
                    "QPushButton:pressed {" // 鼠标按下时
                    "background-color: rgb(206, 206, 206);"
                    "}";


            // 设置本部件
            this->setStyleSheet(
                    "QWidget {"
                    "border: none;"
                    "background-color: transparent;"
                    "}"
            );
            this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

            // 设置已有好友标签
            haveFriendLab_->setText("已有好友");
            haveFriendLab_->setStyleSheet(labelStyleSheet);

            // 设置全部求奥按钮部件
            allCancelBtn_->setFixedSize(QSize(80, 30));
            allCancelBtn_->setText("取消选中");
            allCancelBtn_->setStyleSheet(allCancelBtnStyleSheet);
        }

        // 设置组件布局方法
        void setElementLayout() {
            // 设置布局管理器
            auto totalContainerLayout = new QVBoxLayout();

            totalContainerLayout->setSpacing(20);
            totalContainerLayout->setContentsMargins(0, 0, 0, 0);

            totalContainerLayout->addWidget(haveFriendLab_, 0, Qt::AlignLeft);
            totalContainerLayout->addWidget(container_, 0, Qt::AlignCenter);
            totalContainerLayout->addWidget(allCancelBtn_, 0, Qt::AlignCenter);

            this->setLayout(totalContainerLayout);
        }

        // 设置信号槽方法
        void setElementSignalSlot() {
            connect(allCancelBtn_, &QPushButton::clicked, this, [this]() {
                common::Tools::getInstance()->getLogger()->trace("{0} {1} allCancelBtn_ is clicked", __FILE__, __LINE__);
            });
        }
    };
}
// <<< class ChooseFriendDialog end <<<

#endif //FRONTEND_HAVECONTAINER_HPP
